package org.example.service.impl;

import org.example.entity.Book;
import org.example.entity.Borrow;
import org.example.entity.BorrowDetail;
import org.example.entity.User;
import org.example.feignclient.BookFeignClient;
import org.example.mapper.BorrowMapper;
import org.example.service.BorrowService;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class BorrowServiceImpl implements BorrowService {

    @Resource
    BorrowMapper borrowMapper;

    @Resource
    RestTemplate restTemplate;

    /**
     * 此处bookFeignClient和restTemplate功能类似
     * 都使用只是为了加以对比，个人认为restTemplate比较安全可靠
     * 因为bookFeignClient调用的是controller中的方法，但是controller
     * 中的方法很容易被修改，会很容易影响到feignclien的调用结果
     * 选择一种实现即可
     */
    @Resource
    BookFeignClient bookFeignClient;

    @Override
    public BorrowDetail getUserBorrowDetailByUid(int uid) {
        List<Borrow> borrows = borrowMapper.getBorrowByUid(uid);
        /**server-user为service-user模块resources/application中配置的spring.application.name**/
        User user = restTemplate.getForObject("http://server-user/user/" + uid, User.class);

        /**server-book为service-book模块resources/application中配置的spring.application.name**/
        //List<Book> books = borrows.stream().map(b -> restTemplate.getForObject("http://server-book/book/" + b.getBid(),Book.class)).collect(Collectors.toList());

        /**
         * 此处用Feign的使用类似restTemplate的使用，Feign可以直接调用controller中的方法并返回结果，同36行效果相同
         * 此事例中查询User使用了restTemplate和查询book用了bookFeignClient，只是做一个对比和说明，十几种根据项目的使用习惯使用任意一种即可
         * */
        List<Book> books = borrows.stream().map(b -> bookFeignClient.findBookById(b.getBid())).collect(Collectors.toList());


        BorrowDetail borrowDetail = new BorrowDetail(user,books);
        return borrowDetail;
    }
}
